package com.study.seckill.web.page;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.study.dto.UserDTO;
import com.study.seckill.entity.CourseSeckill;
import com.study.seckill.entity.CourseSeckillOrder;
import com.study.seckill.service.CourseSeckillOrderService;
import com.study.seckill.service.CourseSeckillService;
import com.study.seckill.service.UserService;
import com.study.seckill.util.AlipayConfig;
import com.study.seckill.vo.CourseSeckillDetailVO;
import com.study.seckill.vo.SeckillDetailInfo;
import com.study.util.ResponseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.math.BigInteger;
import java.util.List;

/**
 * @ClassName: CourseSeckillOrderController
 * @Author: wYin
 * @Date: 2022/3/10 14:50
 */
@Controller
@RequestMapping("/page/courseSeckillOrder")
public class CourseSeckillOrderController {
    @Autowired
    private CourseSeckillOrderService courseSeckillOrderService;

    @Autowired
    private CourseSeckillService courseSeckillService;

    @Autowired
    private UserService userService;

    @GetMapping("/getOrderList")
    public String getOrderList(Model model){
        List<CourseSeckillOrder> list = courseSeckillOrderService.list();
        model.addAttribute("data",list);
        return "order_list";
    }

    @PostMapping("/add")
    public synchronized String addOrder(CourseSeckillOrder courseSeckillOrder, Model model, HttpSession httpSession){
        //todo 从session中得到用户的id
        //执行添加
        CourseSeckillOrder result = courseSeckillOrderService.addOrder(courseSeckillOrder, 1);
        if(result==null){
            CourseSeckillDetailVO seckillInfoById = courseSeckillService.getSeckillInfoById(courseSeckillOrder.getSeckillId());
            model.addAttribute("data",seckillInfoById);
            return "item";
        }
        //查询秒杀信息
        CourseSeckill seckill = courseSeckillService.getById(result.getSeckillId());
        //查询用户信息
        ResponseResult<UserDTO> user = userService.getById(Integer.valueOf(result.getUserId()));
        SeckillDetailInfo seckillDetailInfo = new SeckillDetailInfo();
        seckillDetailInfo.setCourseSeckill(seckill);
        seckillDetailInfo.setUserDTO(user.getData());
        seckillDetailInfo.setCourseSeckillOrder(result);
        model.addAttribute("data",seckillDetailInfo);//显示订单详情
        return "orderDetail";
    }

    @PostMapping("/updateOrderStatus")
    @ResponseBody
    public synchronized void updateOrderStatus(CourseSeckillOrder courseSeckillOrder, HttpSession session,
                                            HttpServletRequest request, HttpServletResponse response) throws IOException, AlipayApiException {
        //根据订单的信息执行操作（session中得到用户的信息）
//        if(!result){
//            CourseSeckillOrder order = courseSeckillOrderService.getById(courseSeckillOrder.getId());
//            Integer userId = Integer.valueOf(courseSeckillOrder.getUserId());
//            ResponseResult<UserDTO> user = userService.getById(userId);
//            CourseSeckill seckill = courseSeckillService.getById(courseSeckillOrder.getSeckillId());
//            SeckillDetailInfo seckillDetailInfo = new SeckillDetailInfo();
//            seckillDetailInfo.setCourseSeckill(seckill);
//            seckillDetailInfo.setUserDTO(user.getData());
//            seckillDetailInfo.setCourseSeckillOrder(order);
//            model.addAttribute("data",seckillDetailInfo);
//            return "orderDetail";
//        }
            // 获取初始化的AliPayClient
            AlipayClient alipayClient = new DefaultAlipayClient(
                    AlipayConfig.gatewayUrl,
                    AlipayConfig.app_id,
                    AlipayConfig.merchant_private_key,
                    "json",
                    AlipayConfig.charset,
                    AlipayConfig.alipay_public_key,
                    AlipayConfig.sign_type);
            // 设置请求参数
            AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
            alipayRequest.setReturnUrl(AlipayConfig.return_url);
            alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
            //商户订单号，商户网站订单系统中唯一订单号，必填
//            String out_trade_no = new String(request.getParameter("orderNumber").getBytes("ISO-8859-1"), "UTF-8");
       String out_trade_no = courseSeckillOrder.getOrderNumber();
            //付款金额，必填
        String total_amount = courseSeckillOrder.getSeckillPrice().toString();
//            String total_amount = new String(request.getParameter("seckillPrice").getBytes("ISO-8859-1"), "UTF-8");
            //订单名称，必填
        String subject = courseSeckillOrder.getUserId();
//            String subject = new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");
            //商品描述，可空
//            String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"), "UTF-8");
            alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
                    + "\"total_amount\":\"" + total_amount + "\","
                    + "\"subject\":\"" + subject + "\","
                    + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
            //若想给BizContent增加其他可选请求参数，以增加自定义超时时间参数timeout_express来举例说明
            //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
            //      + "\"total_amount\":\""+ total_amount +"\","
            //      + "\"subject\":\""+ subject +"\","
            //      + "\"body\":\""+ body +"\","
            //      + "\"timeout_express\":\"10m\","
            //      + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
            //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

            //请求
        String result1 = alipayClient.pageExecute(alipayRequest).getBody();
        Boolean result = courseSeckillOrderService.updateOrderStatus(courseSeckillOrder, 1);
            //输出
        response.setContentType("text/html;charset=" + AlipayConfig.charset);
        response.getWriter().write(result1);
        response.getWriter().flush();
        response.getWriter().close();
    }
}
